home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / GNU_C++ / LIB / CFLIB-11.LZH / src / magx.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-03-04  |  3.7 KB  |  167 lines

  1. #include <ctype.h>
  2. #include <stddef.h>
  3. #include "intern.h"
  4.  
  5. /*
  6.  * Der MagX-Cookie
  7.  */
  8.  
  9. typedef struct
  10. {
  11.     char        *in_dos;                               /* Adresse der DOS- Semaphore */
  12.     int        *dos_time;                         /* Adresse der DOS- Zeit */
  13.     int        *dos_date;                         /* Adresse des DOS- Datums */
  14.     long        res1;
  15.     long        res2;
  16.     long        res3;
  17.     void        *act_pd;                               /* Laufendes Programm */
  18.     long        res4;
  19.     int        res5;
  20.     void        *res6;
  21.     void        *res7;                            /* interne DOS- Speicherliste */
  22.     void        (*resv_intmem)(void);         /* DOS- Speicher erweitern */
  23.     long        (*etv_critic)(void);            /* etv_critic des GEMDOS */
  24.     char*        ((*err_to_str)(char e));     /* Umrechnung Code->Klartext */
  25.     long        res8;
  26.     long        res9;
  27.     long        res10;
  28. } DOSVARS;
  29.  
  30.  
  31. typedef struct
  32. {
  33.     long     magic;                                /* muß $87654321 sein */
  34.     void     *membot;                               /* Ende der AES- Variablen    */
  35.     void     *aes_start;                           /* Startadresse */
  36.     long     magic2;                                 /* ist 'MAGX' */
  37.     long     date;                                 /* Erstelldatum ttmmjjjj */
  38.     void     (*chgres)(int res, int txt);    /* Auflösung ändern */
  39.     long     (**shel_vector)(void);          /* residentes Desktop */
  40.     char     *aes_bootdrv;                          /* von hieraus wurde gebootet    */
  41.     int    *vdi_device;                        /* vom AES benutzter VDI-Treiber */
  42.     void    *reservd1;
  43.     void     *reservd2;
  44.     void     *reservd3;
  45.     int     version;                               /* z.B. $0201 ist V2.1 */
  46.     int    release;                               /* 0=alpha..3=release */
  47. } AESVARS;
  48.  
  49.  
  50. typedef struct
  51. {
  52.     long        config_status;
  53.     DOSVARS    *dosvars;
  54.     AESVARS    *aesvars;
  55.     void        *res1;
  56.     void        *hddrv_functions;
  57.     long        status_bits;
  58. } MAGX_COOKIE;
  59.  
  60.  
  61. int get_magx_version(void)
  62. {
  63.     long            v;
  64.     MAGX_COOKIE    *magxCook;
  65.     int            version;
  66.     
  67.     if (getcookie("MagX", &v))
  68.     {
  69.         magxCook = (MAGX_COOKIE *)v;
  70.         version = magxCook->aesvars->version;
  71.     }
  72.     else
  73.         version = 0;
  74.     return version;
  75. }
  76.  
  77.  
  78. int get_magx_obj(OBJECT    *tree, int obj)
  79. {
  80.     short        us, typ, state, flags, ret;
  81.     
  82.     flags = tree[obj].ob_flags;
  83.     state = tree[obj].ob_state & 0x00ff;
  84.     us = (tree[obj].ob_state & 0xff00) >> 8;
  85.  
  86.     typ = tree[obj].ob_type & 0x00ff;
  87.     if (typ == G_USERDEF)
  88.         typ = (tree[obj].ob_type & 0xff00) >> 8;
  89.  
  90.     if (state & WHITEBAK)
  91.     {
  92.         ret = MX_UNKNOWN;
  93.         switch (typ)
  94.         {
  95.             case G_STRING :
  96.                 if (us == 0xff)                /* komplett unterstrichen */
  97.                     ret = MX_UNDERLINE;
  98.                 else if ((us & 0xf0) == 0)    /* String mit Shortcut */
  99.                     ret = MX_SCSTRING;
  100.                 break;
  101.  
  102.             case G_BUTTON :
  103.                 if (us == 0xfe)                /* Gruppenrahmen */
  104.                 {
  105.                     if (state & CHECKED)
  106.                         ret = MX_GROUPBOX2;    /* - kleine Schrift */
  107.                     else
  108.                         ret = MX_GROUPBOX;    /* - normal */
  109.                 }
  110.                 else if (us & 0x80)            /* bit15 -> MagiC-Knopf */
  111.                 {
  112.                     if (flags & RBUTTON)        /* Radio */
  113.                     {
  114.                         if (us == 0xff)
  115.                             ret = MX_RADIO;    /* ohne */
  116.                         else
  117.                             ret = MX_SCRADIO;    /* mit Shortcut */
  118.                     }                        
  119.                     else                            /* Kreuz */
  120.                     {
  121.                         if (us == 0xff)
  122.                             ret = MX_CHECK;    /* ohne */
  123.                         else
  124.                             ret = MX_SCCHECK;    /* mit ShortCut */
  125.                     }
  126.                 }
  127.                 else if (flags & EXIT)         /* Exit-Knopf */
  128.                     ret = MX_SCEXIT;
  129.                 break;
  130.         }
  131.     }
  132.     else if ((typ == G_FTEXT) && (flags & FL3DBAK) && 
  133.                 (tree[obj].ob_spec.tedinfo->te_thickness == -2))
  134.         ret = MX_EDIT3D;
  135.     else
  136.         ret = MX_NOTXOBJ;
  137.     return ret;    
  138. }
  139.  
  140.  
  141. int get_magx_shortcut(OBJECT *tree, int obj, char *c)
  142. {
  143.     int    pos = -1, us, mtyp;
  144.     char    *p;
  145.  
  146.     if (c != NULL)
  147.         *c = '\0';
  148.     mtyp = get_magx_obj(tree, obj);
  149.     
  150.     if ((mtyp == MX_SCRADIO) || (mtyp == MX_SCCHECK) || 
  151.         (mtyp == MX_SCEXIT) || (mtyp == MX_SCSTRING))
  152.     {
  153.         if ((tree[obj].ob_type & 0x00ff) == G_USERDEF)
  154.             p = (char *)tree[obj].ob_spec.userblk->ub_parm;
  155.         else
  156.             p = tree[obj].ob_spec.free_string;
  157.         us = (tree[obj].ob_state & 0xff00) >> 8;
  158.         if (us != 0xFF)
  159.         {
  160.             pos = us & 0xf;
  161.             if (c != NULL)
  162.                 *c = p[pos];
  163.         }
  164.     }
  165.     return pos;
  166. }
  167.